package com.cloudcross.ssp.web.widget;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cloudcross.ssp.base.web.SimpleController;
import com.cloudcross.ssp.common.error.NotFoundException;
import com.cloudcross.ssp.common.utils.Assert;
import com.cloudcross.ssp.common.utils.NamingUtil;

/**
 * 下选框控件数据支持。
 * 
 * @author wuqiang.du
 */
@Controller
@RequestMapping("/widget/selector")
public class SelectorController extends SimpleController {

    private Logger LOG = LogManager.getLogger(getClass());

    /**
     * 获取下拉框数据。
     * 
     * @param module
     *            中缀式的模块名
     * @param parentId
     *            父亲的主键或者唯一ID
     * @return 返回下拉框的数据。
     */
    @RequestMapping("/provide/{module}")
    public @ResponseBody Map<String, List<? extends ISelector>> provide(@PathVariable String module, String[] parentId) {
        Assert.isTrue(StringUtils.isNotBlank(module));
        LOG.debug("请求模块：" + module + ", 父ID：" + Arrays.toString(parentId));

        // 根据module查找对应的provider
        ISelectorProvider provider = null;
        String serviceBeanId = NamingUtil.toCamelCase(module).concat("Service");
        try {
            provider = getBean(ISelectorProvider.class, serviceBeanId);
        } catch (ClassCastException e) {
            LOG.error(StringUtils.EMPTY, e);
        }

        // 模块不支持selector
        LOG.debug("模块对应beanId:" + serviceBeanId);
        if (provider == null) {
            String errorMsg = "/widget/selector/provide/" + module + " 找不到！";
            LOG.error(errorMsg);
            throw new NotFoundException(errorMsg);
        }

        // 返回数据。
        LOG.debug("模块对应的service类：" + provider.getClass());
        return provider.provideData(parentId);
    }

    /**
     * 定义下拉框数据格式接口。
     */
    public interface ISelector {
        /**
         * @return 标签值
         */
        String getLabel();

        /**
         * @return 实际值
         */
        String getValue();
    }

    /**
     * 定义选择器提供数据服务接口。
     */
    public interface ISelectorProvider {
        Map<String, List<? extends ISelector>> provideData(String[] parentId);
    }
}